from typing import Dict, List, Any, Optional

# 任务相关工具定义
class TaskTools:
    def __init__(self, http_client):
        self.http = http_client
    
    def get_tasks(self, params: Optional[Dict[str, Any]] = None):
        """获取任务列表"""
        print('获取任务列表')
        response = self.http.get('/api.php/v1/tasks', params=params)
        print(response)
        return response
        
    def create_task(self, data: Dict[str, Any]):
        """添加单个任务"""
        print('创建新任务')
        response = self.http.post('/api.php/v1/tasks', json=data)
        print(response)
        return response
        
    def get_task_detail(self, task_id: int):
        """获取任务详情"""
        print(f'获取任务ID={task_id}的详情')
        response = self.http.get(f'/api.php/v1/tasks/{task_id}')
        print(response)
        return response
        
    def update_task(self, task_id: int, data: Dict[str, Any]):
        """编辑任务"""
        print(f'编辑任务ID={task_id}的信息')
        response = self.http.put(f'/api.php/v1/tasks/{task_id}', json=data)
        print(response)
        return response
        
    def delete_task(self, task_id: int):
        """删除任务"""
        print(f'删除任务ID={task_id}')
        response = self.http.delete(f'/api.php/v1/tasks/{task_id}')
        print(response)
        return response
        
    def finish_task(self, task_id: int, data: Dict[str, Any]):
        """完成任务"""
        print(f'完成任务ID={task_id}')
        response = self.http.post(f'/api.php/v1/tasks/{task_id}/finish', json=data)
        print(response)
        return response
    
    # 用于注册工具到MCP
    def register(self, mcp_instance):
        """
        将所有任务工具注册到MCP实例
        
        Args:
            mcp_instance: FastMCP实例
        """
        mcp_instance.add_tool(
            self.get_tasks,
            name="get_tasks", 
            description="获取任务列表。参数：可选params(Dict)包含筛选条件如project(项目ID，可从get_projects获取)、status(状态，如wait/doing/done/pause/cancel)、assignedTo(指派给谁，用户ID)、type(任务类型)、limit(每页数量)、page(页码)等。不传参数时获取所有任务。"
        )
        
        mcp_instance.add_tool(
            self.create_task, 
            name="create_task", 
            description="创建新任务。参数：data(Dict，必填)包含任务信息，必填字段有project(项目ID，从get_projects获取)、name(任务名称)、type(任务类型)、assignedTo(指派给谁，用户ID从get_users获取)，可选字段有story(关联需求ID)、pri(优先级)、desc(描述)、estimate(预计工时)、estStarted(预计开始时间)、deadline(截止日期)等。"
        )
        
        mcp_instance.add_tool(
            self.get_task_detail, 
            name="get_task_detail", 
            description="获取任务详情。参数：task_id(int，必填)任务ID。任务ID可从get_tasks方法返回的列表中获取。"
        )
        
        mcp_instance.add_tool(
            self.update_task, 
            name="update_task", 
            description="编辑任务信息。参数：task_id(int，必填)任务ID；data(Dict，必填)包含要更新的字段，如name(任务名称)、status(状态)、assignedTo(指派给谁)、pri(优先级)等。任务ID可从get_tasks获取，现有任务信息可从get_task_detail获取。"
        )
        
        mcp_instance.add_tool(
            self.delete_task, 
            name="delete_task", 
            description="删除任务。参数：task_id(int，必填)要删除的任务ID。任务ID可从get_tasks方法返回的列表中获取。需要项目负责人或任务创建者权限。"
        )
        
        mcp_instance.add_tool(
            self.finish_task, 
            name="finish_task", 
            description="完成任务。参数：task_id(int，必填)任务ID；data(Dict，必填)包含完成相关信息，如consumed(实际消耗工时)、left(剩余工时，通常为0)、comment(完成备注)等。任务ID可从get_tasks获取。只有任务的负责人才能完成任务。"
        ) 